zerochainの実装にキャッチアップする (2) setup
TL; DR;
zkSNARKsのおさらいも兼ねてsetupのところのコードを読み解いていくよ
setup = zerochainの起動前にzkSNARKsに使うためのパラメータを事前に生成する部分(という現状理解)
全体の中でどこだっけ?
https://gyazo.com/50a1d5aa62616ceb18fe43a0ad712f5e
これの左側, circuit generatorを通じてproving keyとverification keyを生成する
function -> circuitへ変換
circuit -> proving key verification keyを生成する
(そぼぎ) proverはcircuitに関する情報をproving key以外必要としないのか?
code: setup.rs
pub fn setup() -> (Parameters<Bls12>, PreparedVerifyingKey<Bls12>) {
let rng = &mut OsRng::new().expect("should be able to construct RNG")
OsRngはRandom Number Generator
BLS12のパラメータと (Prepared VerifyingKey)を生成している
code: setup.rs
// Create parameters for the confidential transfer circuit
let proving_key = {
let c = Transfer::<Bls12> {
params: &PARAMS,
value: None,
remaining_balance: None,
randomness: None,
alpha: None,
proof_generation_key: None,
decryption_key: None,
pk_d_recipient: None,
encrypted_balance: None,
fee: None,
};
confidential transferを検証するためのcircuitを生成する
Transfer型
zero-chain/core/proofs/src/circuit_transfer.rs
code: circuit_transfer.rs
pub struct Transfer<'a, E: JubjubEngine> {
pub params: &'a E::Params,
pub value: Option<u32>,
pub remaining_balance: Option<u32>,
pub randomness: Option<E::Fs>,
pub alpha: Option<E::Fs>,
pub proof_generation_key: Option<ProofGenerationKey<E>>,
pub decryption_key: Option<E::Fs>,
pub pk_d_recipient: Option<edwards::Point<E, PrimeOrder>>,
pub encrypted_balance: Option<Ciphertext<E>>,
pub fee: Option<u32>,
}
code:circuit_transfer.rs
impl<'a, E: JubjubEngine> Circuit<E> for Transfer<'a, E> {
fn synthesize<CS: ConstraintSystem<E>>(
BellemanのCircuitを実装
bellman/src/groth16/generator.rs (CRSを生成するマン)
code: generator.rs
/// Generates a random common reference string for
/// a circuit.
pub fn generate_random_parameters<E, C, R>(
circuit: C,
rng: &mut R
) -> Result<Parameters<E>, SynthesisError>